#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate slog;
extern crate slog_term;     //注意对应的crate名为 slog-term，坑爹
extern crate slog_async;    //注意对应的crate名为 slog-async，同样坑爹

use std::thread;
use slog::Drain;

mod log;

fn main() {
//    println!("Hello, world!");
    let decorator = slog_term::TermDecorator::new().build();
    // 使用紧凑模式日志记录：多行信息构成一条完整记录
    // let drain = slog_term::CompactFormat::new(decorator).build().fuse();
    // 使用完整模式日志记录：一行信息就包含完整记录
    let drain = slog_term::FullFormat::new(decorator).build().fuse();
    let drain = slog_async::Async::new(drain).build().fuse();
    let curr_log = slog::Logger::root(drain, o!("vv" => "xxx"));
    // 开始打出INFO记录
    info!(curr_log, "test");
    // 打出WARN记录，但是是上一条INFO的子集中的记录
    warn!(curr_log.new(o!("new vv"=> "yy")), "new log");
    // 新开一个INFO记录，与上一条INFO同级 <- 因为都是从`log`来打日志
    info!(curr_log, "debug");
    debug!(curr_log.new(o!("Start debug"=>"hi bug")), "catch a bug");

    // LOG更多的使用场景是在一个工程中作全局调用的组件
    // 这可以通过使用`lazy_static`创建全局调用的Logger初始化函数，并加入生命周期来使用
//    crit!(log::logger(),"global call");
    // This following line is required.
    // 'cause logger need time to flush info
    // Otherwise, info will be cleaned because lazy_static has no destructor
//    thread::sleep_ms(1000);
}
